defmodule IocpMonitor.Router do
  @moduledoc """
  TCP上行包的路由模块。
  本模块根据电流盒子发送的上行包的功能码将包分派给指定的controller
  """

  use IocpMonitor.Types

  alias IocpMonitor.Controller.{RealtimeDataController}

  @routes %{
    0x01 => RealtimeDataController
  }

  @doc """
  分派TCP包。

  ## 参数

    * `action` 功能码
    * `device_address` 设备地址
    * `payload` 去除包头、包长度、控制码、功能码、设备地址和校验码后的TCP包
  """
  @spec dispatch(action(), device_address(), list(integer())) :: :ok | {:error, atom()}
  def dispatch(action, device_address, payload) do
    case @routes[action] do
      nil -> :ok
      controller -> controller.handle(device_address, payload)
    end
  end
end
